package com.liu.ai.store;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author liuzq
 * @date 2024/1/18 15:22
 * @description
 *     这个工具类的作用就是用来给所有的SQL操作提供“连接”，和释放连接。
 */
public class JdbcTools {
    //这里使用DataSource的目的是为了（1）限制服务器的连接的上限（2）连接的重用性等
    public static DataSource ds;
    /*
        这里使用ThreadLocal的目的是为了让同一个线程，在多个地方getConnection得到的是同一个连接。
        事务需要统一个数据库链接
     */
    private static ThreadLocal<Connection> tl = new ThreadLocal<>();

    //静态代码块，JDBCToolsVersion1类初始化执行
    static{
        Properties pro = new Properties();
        pro.put("driverClassName","org.postgresql.Driver");
        pro.put("url","jdbc:postgresql://192.168.10.128:5432/maxkb?currentSchema=public");
        pro.put("username","root");
        pro.put("password","Password123@postgres");

        try {
            //加载配置文件
            pro.load(ClassLoader.getSystemResourceAsStream("druid.properties"));
            // 初始化连接池
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() throws SQLException {
         Connection connection = tl.get();
         if(connection  == null){//当前线程还没有拿过连接，就给它从数据库连接池拿一个
             connection = ds.getConnection();
             tl.set(connection);
         }
         return connection;
    }

    public static void free() throws SQLException {
        Connection connection = tl.get();
        if(connection != null){
            tl.remove();
            connection.setAutoCommit(true);//避免还给数据库连接池的连接不是自动提交模式（建议）
            connection.close();
        }
    }
}
